/********************************************************
 * Nombre: GestorDeProfesores.java                      *
 * Version: 1.0.0                                       *
 * Diagrama: GAPI v4.4.0                                *
 * Autor: Alberto de Jesús Castro Becerra               *
 * Creado: 01-03-2013                                   *
 * Modificado:                                          *
 ********************************************************/
package Servicios;

import DAO.DAOAsignaturaOfertaAcademica;
import DAO.DAOAsignaturasAlumno;
import DAO.DAOAsignaturasOptativasAlumno;
import DAO.DAOHistoricoAsignaturaProfesor;
import DAO.DAOProfesor;
import DAO.DAORespuestasEDD;
import Dominio.Profesor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Clase encargada de gestionar operacines sobre profesores mediante la eliminación, registro,
 * modificación y búsquedas para modificar o eliminar la información registrada de todos los profesores
 * @author Alberto
 */
public class GestorDeProfesores extends HttpServlet {

    /**
     * Método encargado de gestionar la operación que se ejecutará sobre el profesor
     * @param request - petición
     * @param response -respuesta
     * @throws ServletException
     * @throws IOException Meto
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String idPeticion = request.getParameter("idPeticion"); 
        
        if(idPeticion.equals(ID_REGISTRO_PROFESOR)){
            registrarProfesor(request, response);
        }
        else if(idPeticion.equals(ID_BUSQUEDA_TODOS_PROFESORES_MODIFICACION)){
            buscarTodosLosProfesoresParaModificacion(request, response);
        }
        else if(idPeticion.equals(ID_BUSQUEDA_PROFESOR)){
            buscarProfesor(request, response);
        }
        else if(idPeticion.equals(ID_MODIFICACION_PROFESOR)){
            modificarProfesor(request, response);
        }
        else if(idPeticion.equals(ID_BUSQUEDA_TODOS_PROFESORES_ELIMINACION)){
            buscarTodosLosProfesoresParaEliminacion(request, response);
        }
        else if(idPeticion.equals(ID_ELIMINACION_PROFESOR)){
            eliminarProfesor(request, response);
        }
    }

    /**
     * Método encargado de procesar peticiones get
     * @param request - petición
     * @param response - respuesta
     * @throws ServletException 
     * @throws IOException 
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Método encargado de procesar peticiones post
     * @param request - petición
     * @param response -respuesta
     * @throws ServletException
     * @throws IOException 
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /**
     * Método encargado de registrar un profesor en la base de datos
     * @param request -petición
     * @param response - respuesta
     */
    private void registrarProfesor(HttpServletRequest request, HttpServletResponse response)  {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String nombres = request.getParameter("nombresProfesor");
            String apellidos = request.getParameter("apellidosProfesor");
            String gradoAcademico = request.getParameter("gradoAcademicoProfesor");
            if(nombres != null && apellidos != null && gradoAcademico != null){
                Profesor profesor = new Profesor();
                profesor.setNombre(nombres);
                profesor.setApellido(apellidos);
                profesor.setGradoAcademico(gradoAcademico);
                
                DAOProfesor daoProfesor = new DAOProfesor();
                if(!daoProfesor.existeProfesor(profesor)){
                    boolean resultadoRegistro = daoProfesor.registrarProfesor(profesor);
                    
                    if(resultadoRegistro == true){
                        out.println("Profesor registrado con exito");
                    }
                    else{
                        out.println("Ocrurrió un error al procesar la peticion");
                    }                
                }
                else{
                    out.println("No se pudo registrar el profesor porque ya existe uno con esos mismos datos");
                }                
                daoProfesor.cerrarConexionAProfesor();
            }
            else{
                out.println("Ocurrio un error al procesar la peticion");
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeProfesores.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
        
    }
    
    /**
     * Método encargado de buscar a todos los profesores e imprimir una tabla para la modificación del
     * mismo
     * @param request - petición
     * @param response - respuesta
     */
    private void buscarTodosLosProfesoresParaModificacion(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            DAOProfesor daoProfesor = new DAOProfesor();
            ArrayList<Profesor> listaDeProfesores = daoProfesor.buscarTodosLosProfesores();
            daoProfesor.cerrarConexionAProfesor();
            String respuesta = "<table class=\"estiloGeneral\">"                         
                             + "    <th>"
                             + "        Profesor"
                             + "    </th>"
                             + "    <th>"
                             + "        Grado acad&eacute;mico"
                             + "    </th>";
            for(int i = 0; i < listaDeProfesores.size(); i++){
                Profesor profesor = listaDeProfesores.get(i);
                
                respuesta += "    <tr>"                     
                           + "        <td>"
                           + "            "+profesor.getNombre()+" "+profesor.getApellido()
                           + "        </td>"
                           + "        <td>"
                           + "            "+profesor.getGradoAcademico()
                           + "        </td>"
                           + "        <td>"
                           + "            <input type=\"button\" value=\"Modificar\" onClick=\"mostrarProfesor("+profesor.getClaveProfesor()+")\"/>"
                           + "        </td>"
                           + "    </tr>";
            }
            respuesta += "</table>"
                       + "<div id=\"div_datos_profesor\"></div>";
            if(listaDeProfesores.isEmpty()){
                out.println("No se encontraron profesores");
            }
            else{
                out.println(respuesta);
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeProfesores.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
    
    /**
     * Método encargado de buscar a un profesor e imprimir un formulario para la modificación del mismo
     * @param request - petición
     * @param response - respuesta
     */
    private void buscarProfesor(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String claveProfesorCadena = request.getParameter("claveProfesor");
            if(claveProfesorCadena != null){
                int claveProfesor = Integer.parseInt(claveProfesorCadena);
                DAOProfesor daoProfesor = new DAOProfesor();
                Profesor profesor = daoProfesor.buscarProfesor(claveProfesor);
                daoProfesor.cerrarConexionAProfesor();
                
                String respuesta = "<div class=\"contenedorFormularioRegistroAlumno\">"
                                 + "<h1>Datos del profesor:</h1>"
                                 + "<table>"
                                 + "<tr>"
                                 + "<td>Nombre(s):</td><td><input type=\"text\" id=\"nombresProfesor\" value=\""+profesor.getNombre()+"\"/></td>"
                                 + "</tr>"
                                 + "<tr>"
                                 + "<td>Apellidos:</td><td><input type=\"text\" id=\"apellidosProfesor\" value=\""+profesor.getApellido()+"\"/></td>"
                                 + "</tr>"
                                 + "<tr>"
                                 + "<td>Grado acad&eacute;mico:</td><td><input type=\"text\" id=\"gradoAcademicoProfesor\" value=\""+profesor.getGradoAcademico()+"\"/></td>"
                                 + "</tr>"
                                 + "</table>"
                                 + "<input type=\"button\" id=\"modificarProfesor\" value=\"Guardar cambios\"/ onClick=\"modificarProfesor("+profesor.getClaveProfesor()+");\"></br>"
                                 + "</div>";
                            
                out.println(respuesta);
                
            }
            else{
                out.println("Ocurrio un error al procesar la peticion");
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeProfesores.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
    
    /**
     * Método encargado de modificar la información del profesor.
     * @param request - petición
     * @param response - respuesta
     */
    private void modificarProfesor(HttpServletRequest request, HttpServletResponse response){
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String claveProfesorCadena = request.getParameter("claveProfesor");
            String nombres = request.getParameter("nombresProfesor");
            String apellidos = request.getParameter("apellidosProfesor");
            String gradoAcademico = request.getParameter("gradoAcademicoProfesor");
            if(claveProfesorCadena != null && nombres != null && apellidos != null && gradoAcademico != null){
                int claveProfesor = Integer.parseInt(claveProfesorCadena);
                
                Profesor profesor = new Profesor();
                profesor.setClaveProfesor(claveProfesor); 
                profesor.setNombre(nombres);
                profesor.setApellido(apellidos);
                profesor.setGradoAcademico(gradoAcademico);
                
                DAOProfesor daoProfesor = new DAOProfesor();
                boolean resultadoActualizacion = daoProfesor.actualizarProfesor(profesor);
                daoProfesor.cerrarConexionAProfesor();
                
                if(resultadoActualizacion == true){
                        out.println("Profesor modificado con exito");
                }
                else{
                    out.println("Ya existe un profesor con esos datos");
                }   
            }
            else{
                out.println("Ocurrio un error al procesar la peticion");
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeProfesores.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
    
    /**
     * Método encargado de buscar todos los profesores e imprimirlos en una talba junto con un botón eliminar
     * @param request - petición
     * @param response - respuesta
     */
    private void buscarTodosLosProfesoresParaEliminacion(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            DAOProfesor daoProfesor = new DAOProfesor();
            ArrayList<Profesor> listaDeProfesores = daoProfesor.buscarTodosLosProfesores();
            daoProfesor.cerrarConexionAProfesor();
            String respuesta = "<table class=\"estiloGeneral\">"                         
                             + "    <th>"
                             + "        Profesor"
                             + "    </th>"
                             + "    <th>"
                             + "        Grado acad&eacute;mico"
                             + "    </th>";
            for(int i = 0; i < listaDeProfesores.size(); i++){
                Profesor profesor = listaDeProfesores.get(i);
                
                respuesta += "    <tr>"                     
                           + "        <td>"
                           + "            "+profesor.getNombre()+" "+profesor.getApellido()
                           + "        </td>"
                           + "        <td>"
                           + "            "+profesor.getGradoAcademico()
                           + "        </td>"
                           + "        <td>"
                           + "            <input type=\"button\" value=\"Eliminar\" onClick=\"eliminarProfesor("+profesor.getClaveProfesor()+")\"/>"
                           + "        </td>"
                           + "    </tr>";
            }
            respuesta += "</table>";
            if(listaDeProfesores.isEmpty()){
                out.println("No se encontraron profesores");
            }
            else{
                out.println(respuesta);
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeProfesores.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
    
    /**
     * Método encargado de eliminar un profesor 
     * @param request - petición
     * @param response - respuesta
     */
    private void eliminarProfesor(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String claveProfesorCadena = request.getParameter("claveProfesor");
            if(claveProfesorCadena != null){        
                int claveProfesor = Integer.parseInt(request.getParameter("claveProfesor"));
                DAORespuestasEDD daoRespuestasEDD = new DAORespuestasEDD();
                
                if(!daoRespuestasEDD.existeProfesorConRespuestasEDD(claveProfesor)) {
                    DAOAsignaturaOfertaAcademica daoAsignaturaOfertaAcademica = new DAOAsignaturaOfertaAcademica();
                    
                    if(!daoAsignaturaOfertaAcademica.existeProfesorEnAsignaturasOfertadas(claveProfesor)) {
                        DAOAsignaturasAlumno daoAsignaturasAlumno = new DAOAsignaturasAlumno();
                        DAOAsignaturasOptativasAlumno daoAsignaturasOptativasAlumno = new DAOAsignaturasOptativasAlumno();
                        
                        if(!daoAsignaturasAlumno.existeAsignaturasAlumnoConProfesor(claveProfesor) && !daoAsignaturasOptativasAlumno.existeAsignaturasOptativasAlumnoConProfesor(claveProfesor)) {
                            DAOHistoricoAsignaturaProfesor daoHistoricoAsignaturaProfesor = new DAOHistoricoAsignaturaProfesor();
                            
                            if(!daoHistoricoAsignaturaProfesor.existeElProfesorEnElHistorico(claveProfesor)) {
                                                                                    
                                DAOProfesor daoProfesor = new DAOProfesor();
                                boolean resultadoEliminacion = daoProfesor.eliminarProfesor(claveProfesor);
                                daoProfesor.cerrarConexionAProfesor();

                                if(resultadoEliminacion == true){
                                     out.println("Profesor eliminado con exito"); 
                                }
                                else{
                                    out.println("Ocurrio un error al procesar la peticion");
                                }        
                                
                            }else{
                                out.println("No se puede eliminar el profesor debido a que el profesor se ha guardado en el historico de asignaturas impartidas");
                            }
                            daoHistoricoAsignaturaProfesor.cerrarConexion();
                        }else{
                            out.println("No se puede eliminar el profesor debido a que al menos un alumno ya ha cursado alguna asignatura con el profesor");
                        }
                        daoAsignaturasAlumno.cerrarConexionAAsignaturaAlumno();
                        daoAsignaturasOptativasAlumno.cerrarConexionAAsignaturaOptativaAlumno();
                    }
                    else{
                        out.println("No se puede eliminar el profesor debido a que al menos una asignatura ofertada es impartida por ese profesor");
                    }
                    daoAsignaturaOfertaAcademica.cerrarConexionAAsignaturaOferta();
                }
                else{
                    out.println("No se puede eliminar el profesor debido a que existen respuestas en la encuesta de desempeño docente para el profesor");
                }
                daoRespuestasEDD.cerrarConexionARespuestasEHE();
            }
            else{
                out.println("Ocurrio un error al procesar la peticion");
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeProfesores.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
    
    private final String ID_REGISTRO_PROFESOR = "registrarProfesor";
    private final String ID_MODIFICACION_PROFESOR = "modificarProfesor";
    private final String ID_ELIMINACION_PROFESOR = "eliminarProfesor";
    private final String ID_BUSQUEDA_TODOS_PROFESORES_MODIFICACION = "buscarTodosLosProfesoresModificacion"; 
    private final String ID_BUSQUEDA_PROFESOR = "buscarProfesor";
    private final String ID_BUSQUEDA_TODOS_PROFESORES_ELIMINACION = "buscarTodosLosProfesoresEliminacion";
}
